package day04;

/*
@Author: 王少杰
@Date: 2025/1/3
@Time: 9:55
@FileName: Demo04.java
@描述:
接口:纯粹的抽象类
    定义的所有方法都是抽象方法的。默认有public、abstract 修饰的
    定义的所有属性都是常量。默认有public、static、final 修饰的
    接口使用interface定义的。
    接口使用多继承的机制。一个类可以实现多个接口
    接口中没有构造方法。

    实现接口的类，叫做这个接口的实现类。
    接口与实现类之间没有继承关系。
    人类--->教师类、学生类。
    Fly--->鸟、飞机

接口和抽象类的差别
接口（Interface）和抽象类（Abstract Class）在面向对象编程中都有相似之处，但它们有一些重要的区别：

1. **目的不同**：
   - **接口**用于定义一组必须被实现的方法，但它不能包含任何方法的实现。接口更关注于行为规范，规定了类应该具备哪些行为。
   - **抽象类**用于定义一些通用的行为和属性，既可以包含方法的实现，也可以包含抽象方法。抽象类通常作为其他类的基类，提供共享的实现和模板。

2. **继承方式**：
   - **接口**可以被多个类实现，一个类可以实现多个接口（支持多重继承）。
   - **抽象类**只能被一个类继承，一个类只能继承一个抽象类（不支持多重继承）。

3. **方法和属性**：
   - **接口**中的方法默认是**抽象的**，并且不能有任何方法的实现（在一些现代语言中，接口可以包含默认实现）。接口不能有实例字段（属性/成员变量），但是可以有常量。
   - **抽象类**可以有抽象方法和普通方法。抽象类可以包含成员变量、构造函数和已实现的方法。

4. **访问修饰符**：
   - **接口**中的方法默认是`public`，并且通常不能指定其他访问修饰符。
   - **抽象类**中的方法可以有不同的访问修饰符（如`private`、`protected`、`public`等）。

5. **使用场景**：
   - **接口**通常用于描述一组相关的行为，适用于需要实现多重继承的场景，尤其是在Java等语言中，接口非常适用于提供多态。
   - **抽象类**更适用于提供通用的功能实现，或者需要共享代码的场景。如果类的行为之间有共通的实现，可以考虑使用抽象类。

简而言之：
- **接口**：更多用于声明行为，规范类实现的功能。
- **抽象类**：更多用于提供共享实现和通用模板。

*/
public class Demo04 {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.upFly();

        Plane plane = new Plane();
        plane.forward(10);
        plane.backward(50);
        plane.left(50);
        plane.right(50);
        plane.upFly();

        Fly fly = new Plane(); //多态，使用接口的实现类来实例化
        fly.downFly();

        Fly fly2 = new Bird();
        fly2.upFly();
    }
}

interface Fly{
    int minHeight = 10;
    public static final int maxHeight = 1000; //public static final加不加都行。
    void upFly();
    public abstract void downFly(); //public abstract加不加都行。

    public static void add(int a, int b, int c, int d) {//静态方法: 类名.方法名   成员方法: 实例.方法名
        System.out.println(a + b);
    }
}

class Bird extends Pet implements Fly{

    @Override
    public void upFly() {
        System.out.println("鸟向上飞");
    }

    @Override
    public void downFly() {
        System.out.println("鸟向下飞");
    }
}
interface Run{
    void forward(int a);
    void backward(int a);
    void left(int angle);
    void right(int angle);
}

class Plane implements Fly,Run{

    @Override
    public void upFly() {
        System.out.println("飞机向上飞");
    }

    @Override
    public void downFly() {
        System.out.println("飞机向下飞");
    }

    @Override
    public void forward(int a) {
        System.out.println("前进" + a + "米");
    }

    @Override
    public void backward(int a) {
        System.out.println("后退" + a + "米");
    }

    @Override
    public void left(int angle) {
        System.out.println("向左" + angle + "角度");
    }

    @Override
    public void right(int angle) {
        System.out.println("向右" + angle + "角度");
    }
}